package main.prototype;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author: kejl
 * @create: 2020-07-15 00:06
 */
public class ConcretePrototype_A implements AbstractPrototype, Serializable {
   //序列化中的ID标志，用户反序列化中的一致性，要不然JVM自动生成造成无法反序列，这个ID可以自动生成
    private static final long serialVersionUID = 1L;


    //引用变量，浅克隆的时候 不会有他们只有基本类型，所以使用deepclone
    //要实现完全的克隆子父 都要实现Serializable 接口带来复杂度
    private List<Integer> list = new ArrayList<Integer>();

    @Override
    public void showdisplayname() {
        System.out.println(this.getClass().hashCode());
    }


    @Override
    public AbstractPrototype clone()  {
        AbstractPrototype abstractPrototype=null;
        try {
            abstractPrototype =  (AbstractPrototype) super.clone();
        }catch (Exception e){
            e.printStackTrace();
        }
        return abstractPrototype;
    }

    //使用序列化技术实现深克隆

    public  AbstractPrototype deepClone() throws IOException, ClassNotFoundException {
        ByteArrayOutputStream bao = new ByteArrayOutputStream();
        ObjectOutputStream oos=new ObjectOutputStream(bao);
        oos.writeObject(this);
        ByteArrayInputStream bis=new ByteArrayInputStream(bao.toByteArray());
        ObjectInputStream ois=new ObjectInputStream(bis);
        return (AbstractPrototype)ois.readObject();

    }

}
